package com.zx._02_thread.基本操作;

import java.util.concurrent.TimeUnit;

/**
 * Function:线程停止
 *
 * Date: 16/03/2018 01:41
 *
 * @since JDK 1.8
 */
public class StopThread {

    public static void main(String[] args) {
        //停止线程的三种方式
        // 1. 正常运行完，使用退出标识，使得线程正常退出，即当run方法完成后进程终止。
        Thread t1 = new Thread(() -> {
            System.out.println("begin..111");
            System.out.println("end..111");
        });
        t1.start();

        sleep();

        // 2.使用stop强行中断线程（此方法为作废过期方法），不推荐使用，暴力终止，可能使一些清理性的工作得不到完成。还可能对锁定的内容进行解锁，容易造成数据不同步的问题。
        Thread t2 = new Thread(() -> {
            System.out.println("begin..22");
            todo();
            System.out.println("end..22");
        });
        t2.start();
        sleep();
        t2.stop();//强制退出，不执行后面的程序，被弃用了，不推荐使用
//		t2.suspend();// 强制挂起线程，被弃用了，不推荐使用，对于synchronized锁的释放有问题，导致死锁出现
//		t2.resume();//  强制唤醒被挂起的线程，被弃用了，不推荐使用

        // 3. 使用interrupt中断线程，使用interrupt()时，如果线程的状态是TIME_WAIT,WAIT状态时，会抛出InterruptedException异常，好让线程及时运行完后自动停止
        Thread t3 = new Thread(() -> {
            System.out.println("begin..33");
            todo();
            System.out.println("end..33");
        });
        t3.start();
        sleep();
        t3.interrupt();// 对线程进行中断的标识。我们再程序中需要判断是否中断，并进行处理


    }

    // 模拟程序运行
    public static void todo() {
        while (!Thread.currentThread().isInterrupted()) {
            String s = "";
            for (int i = 0; i < 10000; i++) {
                s += i;
                s.intern();
            }
        }
    }

    public static void sleep() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
